package org.cnam.mobileShopping.controller;

import java.io.IOException;
import java.util.List;
import java.util.UUID;

import org.cnam.mobileShopping.bean.Constants;
import org.cnam.mobileShopping.bean.MList;
import org.cnam.mobileShopping.bean.Product;
import org.cnam.mobileShopping.bean.Productlist;
import org.cnam.mobileShopping.bean.Userlist;
import org.cnam.mobileShopping.dao.DAOFactory;
import org.cnam.mobileShopping.util.MobileShoppingUtils;
import org.cnam.mobileShopping.wsclient.WSClient;
import org.json.JSONException;

import android.content.Context;
import android.util.Log;

/**
 * Controller sur les listes de courses
 * 
 * @author laurent
 * 
 */
public class ListeController {

	/**
	 * Création d'une liste donc insertion via les webservices ainsi que dans la
	 * base de données locales
	 * 
	 * @param l
	 *            La liste à ajouter
	 * @return La liste ainsi ajouter qui va contenir l'id sur le webservice
	 */
	public static MList createList(Context context, String libelle) {
		MList newList = new MList();
		MList listInServer = null;

		try {
			// premièrement on récupère le userid
			String userid = MobileShoppingUtils.getSharedPreferences(context,
					"userid");
			// insertion dans la base local
			newList.setLabel(libelle);
			newList.setCommonid(UUID.randomUUID().toString());
			newList.setStatus(Constants.statusList.EDITABLE.getId());
			newList.setSynchr(false);
			newList.setVersion(1);
			long id = DAOFactory.getListeDAO(context).create(newList);
			newList = DAOFactory.getListeDAO(context).find((int) id);
			// et dans la base distante.
			if (MobileShoppingUtils.isConnected(context)) {
				listInServer = WSClient.getInstance().addList(newList,
						Integer.parseInt(userid));
			}
			// creation du userList
			// en bd locale
			Userlist userList = new Userlist(
					(short) Constants.statusUser.OWNER.getId(),
					Integer.valueOf(userid), newList.getMlistid());
			userList = UserListController.createUserList(context, userList);

			if (listInServer != null) {
				// la creation sur le serveur c'est bien passé
				// on passe le parametre issynch à true
				newList.setSynchr(true);
				newList.setVersion(listInServer.getVersion());
				DAOFactory.getListeDAO(context).update(newList);
			}
		} catch (IOException e) {
			Log.e("Error in createList", e.getMessage());
		} catch (JSONException e) {
			Log.e("Error in createList", e.getMessage());
		}

		return newList;
	}

	/**
	 * Récupération d'un liste via son ID
	 * 
	 * @param context
	 *            Le context de l'application qui veut accéder à la base de
	 *            données
	 * @param id
	 *            Identifiant de la liste que l'on veut récupérer
	 * @return La liste en question
	 */
	public static MList getList(Context context, Integer id) {
		return DAOFactory.getListeDAO(context).find(id);
	}

	/**
	 * Ajout d'un produit dans la liste via un Productlist
	 * 
	 * @param context
	 *            Le context qui va manipuler les BDD
	 * @param l
	 *            La liste qui va recevoir le produit
	 * @param p
	 *            Le produit à ajouter à la liste
	 * @param qte
	 *            Quantité de ce produit
	 */
	public static void addProduct(Context context, MList l, Product p,
			Integer qte) {

	}

	public static MList updateList(Context context, MList listToUpdate) {
		String userId = MobileShoppingUtils.getSharedPreferences(context,
				"userid");
		try {
			// if (listToUpdate.isSynchr()) {
			// // si la synchro est ok avec le server on monte de version
			// listToUpdate.setVersion(listToUpdate.getVersion() + 1);
			// }
			listToUpdate.setSynchr(false);
			DAOFactory.getListeDAO(context).update(listToUpdate);
			if (MobileShoppingUtils.isConnected(context)) {
				MList listInServer = WSClient.getInstance().updateList(
						listToUpdate, Integer.parseInt(userId));
				if (listInServer != null) {
					listToUpdate.setSynchr(true);
					listToUpdate.setVersion(listInServer.getVersion());
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return listToUpdate;
	}

	/**
	 * Delete a list (ProductList are also deleted).
	 * 
	 * @param context
	 *            the context.
	 * @param listToDelete
	 *            the list to delete
	 * @return true if delete is ok.
	 */
	public static boolean delete(Context context, MList listToDelete) {
		String userId = MobileShoppingUtils.getSharedPreferences(context,
				"userid");
		// on supprime les produitsListes appartenant à la liste
		List<Productlist> listProduct = ProductListController.findByList(
				context, listToDelete.getMlistid());
		for (Productlist p : listProduct) {
			ProductListController.delete(context, p);
		}
		// on supprime la liste dans la bd en local
		boolean resultDelete = DAOFactory.getListeDAO(context).delete(
				listToDelete);
		if (resultDelete && MobileShoppingUtils.isConnected(context)) {
			try {
				// on supprime la liste sur le serveur
				WSClient.getInstance().deleteList(listToDelete,
						Integer.valueOf(userId));
			} catch (IOException e) {
				Log.e("Error in deleteList", e.getMessage());
			} catch (JSONException e) {
				Log.e("Error in deleteList", e.getMessage());
			}
		}
		return resultDelete;

	}
}
